import asyncio

"""
简短回答
有联系 —— 两者都是基于单线程事件循环的异步调度模型，
思路相似（事件循环 + 非阻塞 I/O + 回调/awaitable），但实现细节、调度语义和生态不同。 
主要相似点 • 都以事件循环为核心：轮询 I/O、调度任务/回调并驱动程序进展。 
• 都支持 async/await 风格的协程（JS 的 async → Promise，Python 的 async → coroutine/Task）。 
• 都有并发组合原语（JS: Promise.all；Python: asyncio.gather）。 
• 都把阻塞工作移出事件循环（JS 用 libuv 线程池，Python 用 ThreadPoolExecutor / asyncio.to_thread）。  主要差异（要点） 
• 执行时机：JS 的 Promise/微任务通常是“立即开始执行”（eager）并进入微任务队列；Python 的 coroutine 函数被调用只返回 coroutine 对象，
  只有 await 或 create_task 后才真正运行（lazy）。 
• 微任务/宏任务模型：JS 明确区分 microtask（Promise.then/queueMicrotask）与 macrotask（setTimeout 等），
  微任务在同轮事件循环内比宏任务先执行。asyncio 没有与 JS 完全对应的公开“微任务队列”概念；
  asyncio 的 Task 调度与 loop._ready/调度机制决定执行顺序（行为上可类比但不完全一样）。 
• 平台实现：Node.js 用 libuv 做跨平台底层 I/O（包含线程池）；Python asyncio 基于 selectors / proactor（Windows）并可用不同 loop 实现。 
• 取消与错误处理：Python 的 Task 支持 cancel() 并抛 CancelledError；JS 的 Promise 需要额外模式实现取消。
  异常传播/未处理异常的默认行为也不同（日志/警告策略不同）。  实用建议 
• 从 JS 背景过来，编程思想可复用，但需注意：Python coroutine 是惰性，要显式 create_task 或 await 才运行；阻塞代码必须显式 
  offload（asyncio.to_thread/run_in_executor）。 
• 调试时打印任务类型或在事件循环前后插入 call_soon/call_later 来观察调度次序。
"""


import asyncio

# 获取事件循环
# loop = asyncio.get_event_loop()
# print(f"事件循环: {loop}")
# print(f"循环是否运行: {loop.is_running()}")
# print(f"循环是否关闭: {loop.is_closed()}")


# 手动管理事件循环
async def simple_task():
    await asyncio.sleep(1)
    return "任务完成"


# 方式1：手动管理
loop = asyncio.get_event_loop()
try:
    if not loop.is_running():
        result = loop.run_until_complete(simple_task())
        print(f"手动执行结果: {result}")
finally:
    loop.close()

# 方式2：使用 asyncio.run() (推荐)
result = asyncio.run(simple_task())
print(result)
